package com.sz.virtualbank.service.finance;

import com.sz.virtualbank.dao.entity.FinancialProduct;
import com.sz.virtualbank.dao.entity.InvestmentOrder;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 理财服务接口
 * 
 * @author Claude
 */
public interface FinanceService {
    
    /**
     * 查询理财产品列表
     *
     * @param riskLevel 风险等级（可选）
     * @param minDuration 最小投资期限（可选）
     * @param maxDuration 最大投资期限（可选）
     * @param minReturn 最小预期收益率（可选）
     * @param status 产品状态（可选）
     * @param page 页码
     * @param size 每页条数
     * @return 产品列表与总数
     */
    Map<String, Object> getProductList(Integer riskLevel, Integer minDuration, Integer maxDuration, 
                                       BigDecimal minReturn, Integer status, Integer page, Integer size);
    
    /**
     * 查询理财产品详情
     *
     * @param id 产品ID
     * @return 产品详情
     */
    FinancialProduct getProductDetail(Long id);
    
    /**
     * 查询热门理财产品
     *
     * @param limit 查询数量
     * @return 热门产品列表
     */
    Map<String, Object> getHotProducts(Integer limit);
    
    /**
     * 购买理财产品
     *
     * @param userId 用户ID
     * @param productId 产品ID
     * @param amount 投资金额
     * @param paymentPassword 支付密码
     * @return 订单信息
     */
    InvestmentOrder purchaseProduct(Long userId, Long productId, BigDecimal amount, String paymentPassword);
    
    /**
     * 查询投资订单列表
     *
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @param page 页码
     * @param size 每页条数
     * @return 订单列表与总数
     */
    Map<String, Object> getInvestmentOrderList(Long userId, Integer status, Integer page, Integer size);
    
    /**
     * 查询投资订单详情
     *
     * @param id 订单ID
     * @param userId 用户ID
     * @return 订单详情
     */
    Map<String, Object> getInvestmentOrderDetail(Long id, Long userId);
    
    /**
     * 查询用户总投资金额和收益
     *
     * @param userId 用户ID
     * @return 投资统计信息
     */
    Map<String, BigDecimal> getInvestmentSummary(Long userId);
    
    /**
     * 新增理财产品（管理员接口）
     *
     * @param product 产品信息
     * @return 创建后的产品
     */
    FinancialProduct createProduct(FinancialProduct product);
    
    /**
     * 更新理财产品（管理员接口）
     *
     * @param product 产品信息
     * @return 更新后的产品
     */
    FinancialProduct updateProduct(FinancialProduct product);
    
    /**
     * 更新产品状态（管理员接口）
     *
     * @param id 产品ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateProductStatus(Long id, Integer status);
}
